home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / windraw.c < prev   
C/C++ Source or Header  |  1996-05-27  |  24KB  |  876 lines

  1. /*
  2.  * windraw.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  *    DESSIN DU CONTENU DES FENETRES sous GEM
  7.  *    
  8.  * History:
  9.  * --------
  10.  * 17.06.94: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "WINDRAW.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include    <stdlib.h>                    /* header librairie de fnct std */
  23.     #include <string.h>                    /* header tt de chaines */        
  24.     #include    <tos.h>
  25.     #include    <aes.h>                        /* header AES */
  26.     #include <vdi.h>                        /* header VDI */
  27.    
  28.  
  29. /*
  30.  * Custom headers:
  31.  */
  32.     #include    "SPEC_PU.H"
  33.     #include "WINDR_PU.H"    
  34.     #include    "TEXT_PU.H"                        /* Infos sur texte VDI */
  35.     #include    "AESDEF.H"
  36.     #include "VDI_PU.H"
  37.     
  38.  
  39. /*
  40.  * ------------------------ PROTOTYPES -------------------------
  41.  */
  42.  
  43.  
  44. /*
  45.  * EXTernal prototypes:
  46.  */
  47.     /*
  48.      * Sp‚cial: 
  49.      */
  50.     extern    void    ping( void );                /* Ping! */
  51.     extern    int    max(            /* Out: Maximum des deux INT */
  52.                             int a,    /* In:  INT #1 */
  53.                             int b);    /* In:  INT #2 */
  54.     extern     int    rcintersect( int area_x, int area_y, int area_w, int area_h,
  55.                               int *box_x, int *box_y, int *box_w, int *box_h );
  56.  
  57. /*
  58.  * PUBlic INTernal prototypes:
  59.  */
  60.     static    int    start_WINDRAW(                     /* In: =TRUE si fenˆtre non overlapp‚e */
  61.                             WIPARAMS *    pWiParams );    /* In: fenˆtre que l'on s'apprˆte … redessiner (can be NULL) */
  62.     static    void    end_WINDRAW( void );
  63.     static    void    redraw( 
  64.                             WIPARAMS *pWiParams,        /* In: fenˆtre … redessiner */ 
  65.                             int area_x,                 /* In: zone de l'‚cran en dehors de laquelle */
  66.                             int area_y,                 /*     il ne faut pas dessiner */
  67.                             int area_w, 
  68.                             int area_h, 
  69.                             int take_control );        /* In: =CTRL_OK si on a d‚j… r‚serv‚ l'‚cran, sinon: TAKE_CTRL */
  70.     static    void    redraw_textline( 
  71.                             WIPARAMS    *    pWiParams,    /* In: ParamŠtres de la fenˆtre */
  72.                             TEXTLINE    *    pTextLine,    /* In: Ptr sur ligne … redessiner */
  73.                             long            l_NoLine,    /* In: No de la ligne … redessiner */
  74.                             int            n_col,        /* In: Colonne … partir de laquelle on commence le redraw */
  75.                             int            n_length );    /* In: Longueur … afficher, NIL_1 si on veut la longueur du texte */
  76.  
  77. /*
  78.  * PRIVate INTernal prototypes:
  79.  */
  80.     static    void    redraw_empty( 
  81.                             WIPARAMS *    pWiParams,    
  82.                             int area_x, 
  83.                             int area_y, 
  84.                             int area_w, 
  85.                             int area_h );
  86.     static    void    redraw_form( 
  87.                             WIPARAMS *    pWiParams,    
  88.                             int area_x, 
  89.                             int area_y, 
  90.                             int area_w, 
  91.                             int area_h );
  92.     static    void    redraw_picture( 
  93.                             WIPARAMS *    pWiParams,    
  94.                             int area_x, 
  95.                             int area_y, 
  96.                             int area_w, 
  97.                             int area_h );
  98.     static    void    redraw_text( 
  99.                             WIPARAMS *wi_params_adr, 
  100.                             int area_x, 
  101.                             int area_y, 
  102.                             int area_w, 
  103.                             int area_h );
  104.  
  105.  
  106. /*
  107.  * ------------------------ VARIABLES -------------------------
  108.  */
  109.     
  110.  
  111. /*
  112.  * External variables: 
  113.  */
  114.  
  115.     /* 
  116.      * G‚n‚ral: 
  117.      */
  118.     extern    int    G_ap_id;                        /* Identification par l'AES */
  119.     extern    int    G_x_mini, G_y_mini;        /* Coord sup gauche de l'‚cran */
  120.     extern    int    G_w_maxi, G_h_maxi;        /* Taille de l'‚cran de travail */
  121.     extern    char    *G_tmp_buffer;                /* Tampon */
  122.     /*
  123.      * VDI: 
  124.      */
  125.     extern    int    G_ws_handle;                /* handle virtual workstation VDI */
  126.     extern    int     G_pxyarray[18];            /* Liste de coord X,Y pour le VDI */
  127.     extern    int    G_pxyarray2[10];            /* 2Šme liste */
  128.     extern    MFDB    G_plogMFDB;                    /* block ‚cran logique */
  129.  
  130.  
  131. /*
  132.  * ------------------------ FUNCTIONS -------------------------
  133.  */
  134.  
  135.  
  136.  
  137. /*
  138.  * start_WINDRAW(-)
  139.  *
  140.  * Purpose:
  141.  * --------
  142.  * Signale le d‚but d'un affichage dans une fenˆtre
  143.  * cette fonction va donc r‚server l'‚cran
  144.  * En option: renvoie TRUE si la fenˆtre est affich‚e dans un unique
  145.  * rectangle: no overlap
  146.  *
  147.  * Notes:
  148.  * ------
  149.  * Ne cache pas la souris.
  150.  * Le r‚sultat n'est pas vraiment la r‚ponse … overlap?
  151.  * Ca dirt plutot si on est en un seul bloc ou en plusizur, mais on peut aussi voir 1 seul bloc d'une fenˆtre a moiti‚ cach‚e
  152.  *
  153.  * History:
  154.  * --------
  155.  * 17.06.94: fplanque: Created
  156.  * 04.12.94: correction bug: v‚rifie si TOUTE la feneˆtre est non overlapp‚e, pas seulement 1 rectangle
  157.  */
  158. int    start_WINDRAW(                     /* In: =TRUE si fenˆtre non overlapp‚e */
  159.             WIPARAMS *    pWiParams )        /* In: fenˆtre que l'on s'apprˆte … redessiner (can be NULL) */
  160. {
  161.     /* App prend en charge souris */
  162.     WIND_UPDATE_BEG_MCTRL
  163.     wind_update( BEG_UPDATE );            /* D‚but de construction ‚cran */
  164.  
  165.     /*
  166.      * Teste si la fenˆtre est overlapp‚e ou non:
  167.      */
  168.     if( pWiParams != NULL )
  169.     {    /*
  170.          * Si on veut connaitre cette information:
  171.          */
  172.         int    n_wiHandle = pWiParams -> handle;
  173.         int    n_top_handle;
  174.         int    xr, yr, wr, hr;
  175.         
  176.         /*
  177.          * V‚rifie d‚j… si la fenˆtre est au top:
  178.          */
  179.         wind_get( 0, WF_TOP, &n_top_handle );
  180.         if( n_top_handle == n_wiHandle )
  181.         {
  182.             return    TRUE_1;        /* OK, fenˆtre non overlapp‚e */
  183.         }
  184.         
  185.         wind_get( n_wiHandle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  186.     
  187.         if( wr == pWiParams -> seen_w && hr == pWiParams -> seen_h )
  188.         {    /*
  189.              * Toute la fenˆtre visible tient en un seul rectangle:
  190.              */
  191.             return    TRUE_1;        /* fenˆtre non OVERLAPPEE */
  192.         }
  193.     }
  194.     
  195.     return FALSE0;        /* Fenˆtre est OVERLAPPEE */
  196. }
  197.  
  198.  
  199. /*
  200.  * end_WINDRAW(-)
  201.  *
  202.  * Purpose:
  203.  * --------
  204.  * Signale la fin d'un affichage dans une fenˆtre
  205.  * cette fonction va donc lib‚rer l'‚cran r‚serv‚ par start_WINDRAW()
  206.  *
  207.  * Notes:
  208.  * ------
  209.  * Ne montre pas la souris.
  210.  *
  211.  * History:
  212.  * --------
  213.  * 17.06.94: fplanque: Created
  214.  */
  215. void    end_WINDRAW( void )
  216. {
  217.     wind_update( END_UPDATE );            /* Fin de construction ‚cran */
  218.     /* AES peut reprendre la souris */
  219.     WIND_UPDATE_END_MCTRL
  220. }
  221.  
  222.  
  223. /*
  224.  * send_fullredraw(-)
  225.  *
  226.  * Purpose:
  227.  * --------
  228.  * Envoie un msg auto-adress‚ 
  229.  * demandant un redraw complet d'une fenˆtre
  230.  *
  231.  * History:
  232.  * --------
  233.  * 1993: fplanque: Created
  234.  */
  235. void    send_fullredraw( WIPARAMS *wi_params_adr )
  236. {    
  237.     int    msg[8];                                /* Buffer contenant le message */
  238.     
  239.     msg[0] = WM_REDRAW;                        /* Type du message */
  240.     msg[1] = G_ap_id;                            /* No AES de l'application */
  241.     msg[2] = 0;                                    /* Longueur standard */
  242.     msg[3] = wi_params_adr -> handle;    /* Handle de la fenˆtre */
  243.     wind_get( wi_params_adr -> handle, WF_WORKXYWH, &msg[4], &msg[5],
  244.          &msg[6], &msg[7] );    /* Coordonn‚es de la zone … red‚ssiner... */
  245.     appl_write( G_ap_id, 16, &msg );        /* Envoie le message de redraw */
  246. }
  247.  
  248.  
  249. /*
  250.  * ------------------------ REDRAW -------------------------
  251.  */
  252.  
  253.  
  254. /*
  255.  * redraw(-)
  256.  *
  257.  * Purpose:
  258.  * --------
  259.  * Redraw du contenu d'une fenˆtre
  260.  *
  261.  * History:
  262.  * --------
  263.  * 1993: fplanque: Created
  264.  * 25.05.94: Sorti gestion des textes et r‚organisation
  265.  * 25.05.94: Sorti chaque type de redraw ds fnct ind‚pendante
  266.  * 25.09.94: redraw des fen TYP_ERRORS
  267.  */
  268. void    redraw( 
  269.             WIPARAMS *pWiParams,        /* In: fenˆtre … redessiner */ 
  270.             int area_x,                 /* In: zone de l'‚cran en dehors de laquelle */
  271.             int area_y,                 /*     il ne faut pas dessiner */
  272.             int area_w, 
  273.             int area_h, 
  274.             int take_control )        /* In: =CTRL_OK si on a d‚j… r‚serv‚ l'‚cran, sinon: TAKE_CTRL */
  275. {
  276.     /*
  277.      * Auparavant, on s'assure que la liste des rectangles ne va pas bouger 
  278.      */
  279.     if( take_control == TAKE_CTRL )
  280.     {    /*
  281.           * Si l'application n'a pas encore pris le contr“le de l'‚cran 
  282.          * ... on le fait maintenant: 
  283.          */
  284.         /* App prend en charge souris */
  285.         WIND_UPDATE_BEG_MCTRL
  286.         wind_update( BEG_UPDATE );            /* D‚but de construction ‚cran */
  287.     }
  288.  
  289.     /*
  290.      * Efface le ptr souris:
  291.      */
  292.     graf_mouse( M_OFF, NULL);    
  293.  
  294.     /*
  295.      * Appelle la routine de redraw appropri‚e:
  296.      */
  297.     switch ( pWiParams -> type )
  298.     {
  299.         case TYP_EMPTY:                         /* Fenˆtre vide */
  300.             redraw_empty( pWiParams, area_x, area_y, area_w, area_h );
  301.             break;
  302.  
  303.         case TYP_PI3:                                /* Image PI3 */
  304.             redraw_picture( pWiParams, area_x, area_y, area_w, area_h );
  305.             break;
  306.  
  307.         case    TYP_DESK:
  308.         case    TYP_TREE:
  309.         case    TYP_ARBO:
  310.         case    TYP_DIR:
  311.             redraw_form( pWiParams, area_x, area_y, area_w, area_h );
  312.             break;
  313.             
  314.         case    TYP_TEXT:
  315.         case    TYP_DEBUG:
  316.         case    TYP_TRACK:
  317.         case    TYP_ERRORS:
  318.             redraw_text( pWiParams, area_x, area_y, area_w, area_h );
  319.             break;
  320.             
  321.         default:                /* Un truc qu'on ne sait pas d‚ssiner! */
  322.             ping();
  323.     }
  324.         
  325.     /*
  326.      * Affiche le ptr souris:
  327.      */
  328.     graf_mouse( M_ON, 0);                
  329.  
  330.     /*
  331.      * Peut-ˆtre faut il signaler la fin de la construction de l'‚cran: 
  332.      */
  333.     if( take_control == TAKE_CTRL )
  334.     {    /* Si l'application a pris le contr“le de l'‚cran juste pour le redraw */
  335.         /* ... on le rends maintenant: */
  336.         wind_update( END_UPDATE );            /* Fin de construction ‚cran */
  337.         /* AES peut reprendre la souris */
  338.         WIND_UPDATE_END_MCTRL
  339.     }
  340. }
  341.  
  342.  
  343.  
  344. /*
  345.  * redraw_empty(-)
  346.  *
  347.  * Purpose:
  348.  * --------
  349.  * Redraw d'une fenˆtre vide(!)
  350.  *
  351.  * Notes:
  352.  * ------
  353.  * Cette fonction est pr‚vue pour ˆtre appell‚e par redraw()
  354.  *
  355.  * History:
  356.  * --------
  357.  * 25.05.94: fplanque: Created by extracting from redraw()
  358.  */
  359. void    redraw_empty( 
  360.             WIPARAMS *    pWiParams,    
  361.             int area_x, 
  362.             int area_y, 
  363.             int area_w, 
  364.             int area_h )
  365. {
  366.     int    wi_handle = pWiParams -> handle;    /* Handle fenˆtre */
  367.     int    xr,yr,wr,hr;                    /* Coords rectangles fournis par AES */
  368.     int    xr2, yr2;                        /* Coords inf droites pour VDI */
  369.  
  370.     /*
  371.      * Redraw de chacun des rectangles composant la fenˆtre visible:
  372.      */
  373.     wind_get( wi_handle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  374.     while( wr && hr )                    
  375.     {    /*
  376.          * Tant que dimensions non nulles 
  377.          */
  378.         if ( rcintersect ( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, &xr, &yr, &wr, &hr ) )
  379.         {    /*
  380.              * Si rectangle est dans l'‚cran 
  381.              */
  382.             if ( rcintersect( area_x, area_y, area_w, area_h, &xr, &yr, &wr, &hr ) )
  383.             {    /* 
  384.                  * Si rect est dans la zone de redraw:
  385.                  */
  386.                 xr2 = xr +wr -1;        /* Coords inf droites du rectangle */
  387.                 yr2 = yr +hr -1;
  388.  
  389.                 G_pxyarray[0]=xr;
  390.                 G_pxyarray[1]=yr;
  391.                 G_pxyarray[2]=xr2;
  392.                 G_pxyarray[3]=yr2;
  393.                 vr_recfl( G_ws_handle, G_pxyarray );        /* Carr‚ blanc! */
  394.             }
  395.         }
  396.         wind_get( wi_handle, WF_NEXTXYWH, &xr, &yr, &wr, &hr );
  397.     }
  398. }
  399.  
  400.  
  401.  
  402. /*
  403.  * redraw_form(-)
  404.  *
  405.  * Purpose:
  406.  * --------
  407.  * Redraw d'une fenˆtre contenant un formulaire
  408.  *
  409.  * Notes:
  410.  * ------
  411.  * Cette fonction est pr‚vue pour ˆtre appell‚e par redraw()
  412.  *
  413.  * History:
  414.  * --------
  415.  * 25.05.94: fplanque: Created by extracting from redraw()
  416.  */
  417. void    redraw_form( 
  418.             WIPARAMS *    pWiParams,    
  419.             int area_x, 
  420.             int area_y, 
  421.             int area_w, 
  422.             int area_h )
  423. {
  424.     int    wi_handle = pWiParams -> handle;    /* Handle fenˆtre */
  425.     int    xr,yr,wr,hr;                    /* Coords rectangles fournis par AES */
  426.  
  427.     /*
  428.      * Adresse formulaire: 
  429.      */
  430.     OBJECT * tree = pWiParams -> draw_ptr.tree;        /* Adr form */
  431.  
  432.     /*
  433.      * Pour l'arborescence, il faut positionner le formulaire d'obord: 
  434.      */
  435.     if ( pWiParams -> type == TYP_TREE )
  436.     {    /* Si on va faire un redraw de l'arbo: */
  437.         tree[ ROOT ] .ob_x = pWiParams -> work_x - (int) (pWiParams -> seen_x) +OUTLINE_INWIN;
  438.         tree[ ROOT ] .ob_y = pWiParams -> work_y - (int) (pWiParams -> seen_y) +OUTLINE_INWIN;
  439.     }
  440.  
  441.     /*
  442.      * Redraw de chacun des rectangles composant la fenˆtre visible:
  443.      */
  444.     wind_get( wi_handle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  445.     while( wr && hr )                    
  446.     {    /*
  447.          * Tant que dimensions non nulles 
  448.          */
  449.         if ( rcintersect ( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, &xr, &yr, &wr, &hr ) )
  450.         {    /*
  451.              * Si rectangle est dans l'‚cran 
  452.              */
  453.             if ( rcintersect( area_x, area_y, area_w, area_h, &xr, &yr, &wr, &hr ) )
  454.             {    /* 
  455.                  * Si rect est dans la zone de redraw:
  456.                  */
  457.                 objc_draw( tree, 0, 5, xr, yr, wr, hr );
  458.             }
  459.         }
  460.         wind_get( wi_handle, WF_NEXTXYWH, &xr, &yr, &wr, &hr );
  461.     }
  462. }
  463.  
  464.  
  465.  
  466.  
  467. /*
  468.  * redraw_picture(-)
  469.  *
  470.  * Purpose:
  471.  * --------
  472.  * Redraw d'une image bitmap dans une fenˆtre
  473.  *
  474.  * Notes:
  475.  * ------
  476.  * Cette fonction est pr‚vue pour ˆtre appell‚e par redraw()
  477.  *
  478.  * History:
  479.  * --------
  480.  * 25.05.94: fplanque: Created by extracting from redraw()
  481.  */
  482. void    redraw_picture( 
  483.             WIPARAMS *    pWiParams,    
  484.             int area_x, 
  485.             int area_y, 
  486.             int area_w, 
  487.             int area_h )
  488. {
  489.     int    wi_handle = pWiParams -> handle;    /* Handle fenˆtre */
  490.     int    xr,yr,wr,hr;                    /* Coords rectangles fournis par AES */
  491.     int    xr2, yr2;                        /* Coords inf droites pour VDI */
  492.  
  493.     /*
  494.      * Coord zone de travail de la fenˆtre:
  495.      */
  496.     int    wkspace_x = pWiParams -> work_x;
  497.     int    wkspace_y = pWiParams -> work_y;
  498.  
  499.     /*
  500.      * Offset de la fenˆtre sur le document: 
  501.      */
  502.     int    offset_x= (int) (pWiParams -> seen_x);
  503.     int    offset_y= (int) (pWiParams -> seen_y);
  504.                 /* printf( "\rseen_x=%d seen_y=%d  ", offset_x, offset_y ); */
  505.         
  506.     /*
  507.      * Redraw de chacun des rectangles composant la fenˆtre visible:
  508.      */
  509.     wind_get( wi_handle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  510.     while( wr && hr )                    
  511.     {    /*
  512.          * Tant que dimensions non nulles 
  513.          */
  514.         if ( rcintersect ( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, &xr, &yr, &wr, &hr ) )
  515.         {    /*
  516.              * Si rectangle est dans l'‚cran 
  517.              */
  518.             if ( rcintersect( area_x, area_y, area_w, area_h, &xr, &yr, &wr, &hr ) )
  519.             {    /* 
  520.                  * Si rect est dans la zone de redraw:
  521.                  */
  522.                 xr2 = xr +wr -1;        /* Coords inf droites du rectangle */
  523.                 yr2 = yr +hr -1;
  524.  
  525.                 G_pxyarray[0]=offset_x+xr-wkspace_x; /* Coord source */
  526.                 G_pxyarray[1]=offset_y+yr-wkspace_y;
  527.                 G_pxyarray[2]=G_pxyarray[0]+wr-1;
  528.                 G_pxyarray[3]=G_pxyarray[1]+hr-1;
  529.                 G_pxyarray[4]=xr;                            /* Coord destination */
  530.                 G_pxyarray[5]=yr;
  531.                 G_pxyarray[6]=xr2;
  532.                 G_pxyarray[7]=yr2;
  533.                 vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
  534.                               pWiParams -> draw_ptr.psrcMFDB, &G_plogMFDB);
  535.             }
  536.         }
  537.         wind_get( wi_handle, WF_NEXTXYWH, &xr, &yr, &wr, &hr );
  538.     }
  539. }
  540.  
  541.  
  542.  
  543. /*
  544.  * redraw_text(-)
  545.  *
  546.  * Purpose:
  547.  * --------
  548.  * Redraw d'un texte dans une fenˆtre
  549.  *
  550.  * Notes:
  551.  * ------
  552.  * Cette fonction est pr‚vue pour ˆtre appell‚e par redraw()
  553.  *
  554.  * History:
  555.  * --------
  556.  * 25.05.94: fplanque: Gestion curseur ds textes
  557.  * 25.05.94: fplanque: Created by extracting from redraw()
  558.  * 25.05.94: fplanque: Simplification, retrait des variables inutiles
  559.  */
  560. void    redraw_text( 
  561.             WIPARAMS *    pWiParams,    
  562.             int area_x, 
  563.             int area_y, 
  564.             int area_w, 
  565.             int area_h )
  566. {
  567.     int    wi_handle = pWiParams -> handle;    /* Handle fenˆtre */
  568.     int    xr,yr,wr,hr;                    /* Coords rectangles fournis par AES */
  569.     int    xr2, yr2;                        /* Coords inf droites pour VDI */
  570.     int    hout, vout;                        /* R‚ponse VDI */
  571.     int    foo;                                /* Bidon */
  572.     int    line_y;                            /* Coordonn‚e pix Y de la ligne en cours d'affichage */
  573.  
  574.     /* 
  575.      * Infos sur le texte: 
  576.      */
  577.     TEXT_DRAWPAR    * pTextDrawPar = pWiParams -> draw_ptr.pTextDrawPar;
  578.     /*
  579.      * Ligne portant le Curseur:
  580.      */
  581.     TEXTLINE    * pTextLine_Csr = pTextDrawPar -> pTextLine_edit;
  582.     /*
  583.      * Ligne en cours d'affichage:
  584.      */
  585.     TEXTLINE    *line_ptr;                    
  586.  
  587.  
  588.     /*
  589.      * Calcule coord pix Y sup‚rieure 
  590.      * de la premiŠre ligne affich‚e (topline): 
  591.      */
  592.     int    line_h = pTextDrawPar -> n_cell_h;                                    /* Hauteur d'une ligne en pixels */
  593.     int    text_y = (pWiParams -> work_y)                                         /* Pos Y sup de la topline) */
  594.                         - line_h + (line_h / TEXT_VMARGINS_LINERATIO)         /* Laisse un peu d'espace blanc */
  595.                         - (int)((pWiParams -> seen_y) % line_h);        /* Tient compte du fait que la ligne peut ˆtre d‚cal‚e par rapport … son alignement vertical initial */
  596.  
  597.     /*
  598.      * Calcule le 1er car … afficher … partir de la gauche
  599.      * et sa coord pix X:
  600.      */
  601.     int    cell_w      = pTextDrawPar -> n_cell_w;                                /* Largeur d'un emplacement caractŠre en pixels */
  602.     int    first_col = ((int)(pWiParams -> seen_x) - TEXT_HMARGINS_WIDTH) / cell_w;
  603.     int    text_x     = (pWiParams -> work_x)                        /* Position en pixels pour l'affichage des lignes de texte */
  604.                             - ((int)(pWiParams -> seen_x) - TEXT_HMARGINS_WIDTH) % cell_w;    /* Laisse une marge de 4 pixels sur la gauche */
  605.  
  606.  
  607.     /*
  608.      * Fixe coordonn‚es de la r‚f d'un caractŠre 
  609.      */
  610.     vst_alignment ( G_ws_handle, HALIGN_LEFT, VALIGN_TOP, &hout, &vout );
  611.                                 /*    printf("Hor: %d, Vert: %d\n", hout, vout); */
  612.     /*
  613.      * Fixe couleur: 
  614.      */
  615.     vst_color( G_ws_handle, 1 );
  616.  
  617.     /*
  618.      * Fixe taille: 
  619.      */
  620.     vst_point( G_ws_handle, pTextDrawPar -> n_points, &foo, &foo, &foo, &foo );
  621.  
  622.     /*
  623.      * Redraw de chacun des rectangles composant la fenˆtre visible:
  624.      */
  625.     wind_get( wi_handle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  626.     while( wr && hr )                    
  627.     {    /*
  628.          * Tant que dimensions non nulles 
  629.          */
  630.         if ( rcintersect ( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, &xr, &yr, &wr, &hr ) )
  631.         {    /*
  632.              * Si rectangle est dans l'‚cran 
  633.              */
  634.             if ( rcintersect( area_x, area_y, area_w, area_h, &xr, &yr, &wr, &hr ) )
  635.             {    /* 
  636.                  * Si rect est dans la zone de redraw:
  637.                  */
  638.                 xr2 = xr +wr -1;        /* Coords inf droites du rectangle */
  639.                 yr2 = yr +hr -1;
  640.  
  641.                 /*
  642.                  * Pointeur sur la ligne texte en cours d'affichage: 
  643.                  */
  644.                 line_ptr = pTextDrawPar -> pTextLine_top;    /* On commence tjs au d‚but de la fenˆtre: */
  645.  
  646.                 /*
  647.                  * Zone a red‚ssiner: 
  648.                  */
  649.                 G_pxyarray[0]=xr;
  650.                 G_pxyarray[1]=yr;
  651.                 G_pxyarray[2]=xr2;
  652.                 G_pxyarray[3]=yr2;
  653.                 vs_clip( G_ws_handle, YES1, G_pxyarray );    /* Clipping pour text */
  654.  
  655.                 for ( line_y = text_y; 
  656.                         (line_y <= yr2) && ( line_ptr != NULL );
  657.                         line_y += line_h, line_ptr = line_ptr -> next )
  658.                 {
  659.                     /*
  660.                      * Efface portion d'‚cran correspondant … la ligne:
  661.                      */
  662.                     G_pxyarray[1]=line_y;                        /* Position Y de la ligne */
  663.                     G_pxyarray[3]=line_y + line_h -1;        /* Bas de la ligne */
  664.                     vr_recfl( G_ws_handle, G_pxyarray );    /* Fond blanc! */
  665.  
  666.                     /*
  667.                      * Affiche texte de la ligne:
  668.                      */
  669.                     if (    line_ptr -> text  !=  NULL
  670.                         &&    line_ptr -> length >= first_col )
  671.                     {
  672.                         v_gtext(    G_ws_handle,
  673.                                     text_x, line_y, 
  674.                                     &(line_ptr -> text[ first_col ]) );    /* Long max = INT_IN_SIZE = 128 caractŠres (1 car par int) */
  675.                     }
  676.                     
  677.                     /*
  678.                      * Affiche le curseur:
  679.                      */
  680.                     if( line_ptr == pTextLine_Csr )
  681.                     {    /*
  682.                          * Si on est sur la Ligne portant le cusreur:
  683.                          */
  684.                         G_pxyarray2[0] = text_x + (pTextDrawPar -> n_ColCsr - first_col) * cell_w;    /* Position X du curseur */
  685.                         G_pxyarray2[1] = line_y;                        /* Position Y de la ligne */
  686.                         G_pxyarray2[2] = G_pxyarray2[0]+CURSOR_WIDTH-1;    /* Position X droite du curseur */
  687.                         G_pxyarray2[3] = G_pxyarray[3];                /* Bas de la ligne */
  688.                         vsf_interior( G_ws_handle, FIS_SOLID );    /* remplissage: PLEIN(couleur courante) */
  689.                         vswr_mode( G_ws_handle, MD_XOR );
  690.                         vr_recfl( G_ws_handle, G_pxyarray2 );     
  691.                         vswr_mode( G_ws_handle, MD_REPLACE );
  692.                         vsf_interior( G_ws_handle, FIS_HOLLOW );    /* remplissage: VIDE(blanc) */
  693.                     }
  694.                 }
  695.                 
  696.                 if (line_y <= yr2)
  697.                 {    /*
  698.                      * S'il reste du blanc en dessous: 
  699.                      */
  700.                     G_pxyarray[1]=line_y;                        /* Position Y de la ligne */
  701.                     G_pxyarray[3]=yr+hr-1;                        /* Bas de la zone … redessiner */
  702.                     vr_recfl( G_ws_handle, G_pxyarray );    /* Fond blanc! */
  703.                 }
  704.             }
  705.         }
  706.         wind_get( wi_handle, WF_NEXTXYWH, &xr, &yr, &wr, &hr );
  707.     }
  708.     vs_clip( G_ws_handle, NO0, G_pxyarray );    /* Clipping OFF! */
  709. }
  710.  
  711.  
  712.  
  713. /*
  714.  * redraw_textline(-)
  715.  *
  716.  * Purpose:
  717.  * --------
  718.  * Redraw d'une ligne de texte dans une fenˆtre
  719.  *
  720.  * Algorythm:
  721.  * ----------  
  722.  * - ConsidŠre que l'application d‚tient le CONTROLE de l'‚cran
  723.  * - Efface/restore pointeur souris
  724.  *
  725.  * Suggest:
  726.  * --------
  727.  * Faire une version optimis‚e … utiliser lorsque la fenˆtre est
  728.  * au premier plan.
  729.  *
  730.  * History:
  731.  * --------
  732.  * 30.05.94: fplanque: created
  733.  * 18.06.94: Permet maintenant de sp‚cifier la longueur de ligne … afficher
  734.  * 20.08.94: n_minLength est maintenant en pixels
  735.  */
  736. void    redraw_textline( 
  737.             WIPARAMS    *    pWiParams,        /* In: ParamŠtres de la fenˆtre */
  738.             TEXTLINE    *    pTextLine,        /* In: Ptr sur ligne … redessiner */
  739.             long            l_NoLine,        /* In: No de la ligne … redessiner */
  740.             int            n_col,            /* In: Colonne … partir de laquelle on commence le redraw */
  741.             int            n_minLength )    /* In: Longueur minimale … afficher en pixels */
  742. {
  743.     int    wi_handle = pWiParams -> handle;    /* Handle fenˆtre */
  744.     int    xr,yr,wr,hr;                    /* Coords rectangles fournis par AES */
  745.     int    hout, vout;                        /* R‚ponse VDI */
  746.     int    foo;                                /* Bidon */
  747.  
  748.     /* 
  749.      * Infos sur le texte: 
  750.      */
  751.     TEXT_DRAWPAR * pTextDrawPar = pWiParams -> draw_ptr.pTextDrawPar;
  752.  
  753.     /*
  754.      * Calcule coord pix Y sup‚rieure 
  755.      * de la ligne … afficher: 
  756.      */
  757.     int    line_h = pTextDrawPar -> n_cell_h;                                /* Hauteur d'une ligne en pixels */
  758.     int    text_y = (pWiParams -> work_y)                                     /* Pos Y sup de la topline */
  759.                         - line_h + (line_h / TEXT_VMARGINS_LINERATIO)     /* Laisse un peu d'espace blanc */
  760.                         - (int)((pWiParams -> seen_y) % line_h);            /* Tient compte du fait que la ligne peut ˆtre d‚cal‚e par rapport … son alignement vertical initial */
  761.     int    line_y = text_y + (int)( l_NoLine - pTextDrawPar -> l_topline ) * line_h;
  762.  
  763.     /*
  764.      * Calcule le 1er car … afficher … partir de la gauche
  765.      * et sa coord pix X:
  766.      */
  767.     int    cell_w      = pTextDrawPar -> n_cell_w;                                /* Largeur d'un emplacement caractŠre en pixels */
  768.     int    first_col = ((int)(pWiParams -> seen_x) - TEXT_HMARGINS_WIDTH) / cell_w;
  769.     int    text_x     = (pWiParams -> work_x)                        /* Position en pixels pour l'affichage des lignes de texte */
  770.                             - ((int)(pWiParams -> seen_x) - TEXT_HMARGINS_WIDTH) % cell_w;    /* Laisse une marge de 4 pixels sur la gauche */
  771.     int    line_x     = text_x + ( n_col - first_col ) * cell_w;    /* Position de la premiŠre colonne … afficher */
  772.  
  773.     int    n_areaW;
  774.  
  775.     /*
  776.      * Calcule coordonn‚es du rectangle … redessiner:
  777.      */
  778.     n_areaW = max( n_minLength,
  779.                         (pTextLine -> length - n_col) * cell_w + CURSOR_WIDTH );
  780.  
  781.     /*
  782.      * Fixe coordonn‚es de la r‚f d'un caractŠre 
  783.      */
  784.     vst_alignment ( G_ws_handle, HALIGN_LEFT, VALIGN_TOP, &hout, &vout );
  785.                                 /*    printf("Hor: %d, Vert: %d\n", hout, vout); */
  786.     /*
  787.      * Fixe couleur: 
  788.      */
  789.     vst_color( G_ws_handle, 1 );
  790.  
  791.     /*
  792.      * Fixe taille: 
  793.      */
  794.     vst_point( G_ws_handle, pTextDrawPar -> n_points, &foo, &foo, &foo, &foo );
  795.  
  796.     /*
  797.      * Efface le ptr souris:
  798.      */
  799.     graf_mouse( M_OFF, NULL);    
  800.  
  801.     /*
  802.      * Redraw de chacun des rectangles composant la fenˆtre visible:
  803.      */
  804.     wind_get( wi_handle, WF_FIRSTXYWH, &xr, &yr, &wr, &hr );
  805.     while( wr && hr )                    
  806.     {    /*
  807.          * Tant que dimensions non nulles 
  808.          */
  809.         if ( rcintersect ( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, &xr, &yr, &wr, &hr ) )
  810.         {    /*
  811.              * Si rectangle est dans l'‚cran 
  812.              */
  813.             if ( rcintersect( line_x, line_y, n_areaW, line_h, &xr, &yr, &wr, &hr ) )
  814.             {    /* 
  815.                  * Si rect est dans la zone de redraw:
  816.                  *
  817.                  * Zone a red‚ssiner: 
  818.                  */
  819.                 G_pxyarray[0]=xr;
  820.                 G_pxyarray[1]=yr;
  821.                 G_pxyarray[2]=xr +wr -1;
  822.                 G_pxyarray[3]=yr +hr -1;
  823.  
  824.                 /*
  825.                  * Fond blanc:
  826.                  */
  827.                 vr_recfl( G_ws_handle, G_pxyarray );
  828.  
  829.                 /*
  830.                  * Clipping pour text
  831.                  */
  832.                 vs_clip( G_ws_handle, YES1, G_pxyarray );    
  833.  
  834.                 /*
  835.                  * Affiche texte de la ligne:
  836.                  */
  837.                 if (    pTextLine -> text  !=  NULL
  838.                     &&    pTextLine -> length >= n_col )
  839.                 {
  840.                     v_gtext(    G_ws_handle,
  841.                                 line_x, line_y, 
  842.                                 &(pTextLine -> text[ n_col ]) );    /* Long max = INT_IN_SIZE = 128 caractŠres (1 car par int) */
  843.                 }
  844.                     
  845.                 /*
  846.                  * Affiche le curseur:
  847.                  */
  848.                 if( pTextLine == pTextDrawPar -> pTextLine_edit )
  849.                 {    /*
  850.                      * Si on est sur la Ligne portant le cusreur:
  851.                      */
  852.                     G_pxyarray[0] = text_x + (pTextDrawPar -> n_ColCsr - first_col) * cell_w;    /* Position X du curseur */
  853.                     G_pxyarray[2] = G_pxyarray[0]+CURSOR_WIDTH-1; /* Position X droite du curseur */
  854.                     vsf_interior( G_ws_handle, FIS_SOLID );        /* remplissage: PLEIN(couleur courante) */
  855.                     vswr_mode( G_ws_handle, MD_XOR );
  856.                     vr_recfl( G_ws_handle, G_pxyarray );     
  857.                     vswr_mode( G_ws_handle, MD_REPLACE );
  858.                     vsf_interior( G_ws_handle, FIS_HOLLOW );    /* remplissage: VIDE(blanc) */
  859.                 }
  860.             }
  861.         }
  862.         wind_get( wi_handle, WF_NEXTXYWH, &xr, &yr, &wr, &hr );
  863.     }
  864.  
  865.     /*
  866.      * Affiche le ptr souris:
  867.      */
  868.     graf_mouse( M_ON, 0);                
  869.  
  870.     /*
  871.      * Clipping OFF! 
  872.      */
  873.     vs_clip( G_ws_handle, NO0, G_pxyarray );    
  874. }
  875.  
  876.